#!/bin/sh

# Copyright 2018 by Denys Vlasenko <vda.linux@googlemail.com>
# Licensed under GPLv2, see file LICENSE in this source tree.

. ./testing.sh

input=\
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"\
"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"\
"\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"\
"\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"\
"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff"

little_endian=false
{ printf '\0\1' | hexdump -d | grep -q 256; } && little_endian=true
readonly little_endian

# testing "description" "command" "result" "infile" "stdin"
testing 'hexdump -C with four NULs' \
	'hexdump -C' \
	"\
00000000  00 00 00 00                                       |....|
00000004
" \
	'' \
	'\0\0\0\0'

testing "hexdump does not think last padded block matches any full block" \
	"hexdump -e '1/1 \"%02x|\"1/1 \"%02x!\\n\"'" \
	"\
00|00!
*
00|  !
" \
	'' \
	'\0\0\0\0\0\0\0\0\0\0\0'

testing "hexdump thinks last full block can match" \
	"hexdump -e '1/1 \"%02x|\"1/1 \"%02x!\\n\"'" \
	"\
00|00!
*
" \
	'' \
	'\0\0\0\0\0\0\0\0\0\0\0\0'

testing "hexdump -e %3_u" \
	"hexdump -e '16/1 \" %3_u\" \"\n\"'" \
	"\
 nul soh stx etx eot enq ack bel  bs  ht  lf  vt  ff  cr  so  si
 dle dc1 dc2 dc3 dc4 nak syn etb can  em sub esc  fs  gs  rs  us
   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ del
  80  81  82  83  84  85  86  87  88  89  8a  8b  8c  8d  8e  8f
  f0  f1  f2  f3  f4  f5  f6  f7  f8  f9  fa  fb  fc  fd  fe  ff
" \
        "" "$input"

testing "hexdump -e %3_c" \
	"hexdump -e '16/1 \" %3_c\" \"\n\"'" \
'  \\0 001 002 003 004 005 006  \\a  \\b  \\t  \\n  \\v  \\f  \\r 016 017
 020 021 022 023 024 025 026 027 030 031 032 033 034 035 036 037
   p   q   r   s   t   u   v   w   x   y   z   {   |   }   ~ 177
 200 201 202 203 204 205 206 207 210 211 212 213 214 215 216 217
 360 361 362 363 364 365 366 367 370 371 372 373 374 375 376 377
' \
        "" "$input"

testing "hexdump -e /1 %d" \
	"hexdump -e '16/1 \" %4d\" \"\n\"'" \
	"\
    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15
   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31
  112  113  114  115  116  117  118  119  120  121  122  123  124  125  126  127
 -128 -127 -126 -125 -124 -123 -122 -121 -120 -119 -118 -117 -116 -115 -114 -113
  -16  -15  -14  -13  -12  -11  -10   -9   -8   -7   -6   -5   -4   -3   -2   -1
" \
        "" "$input"

$little_endian || SKIP=1
testing "hexdump -e /2 %d (little endian)" \
        "hexdump -e '8/2 \" %6d\" \"\n\"'" \
        "\
    256    770   1284   1798   2312   2826   3340   3854
   4368   4882   5396   5910   6424   6938   7452   7966
  29040  29554  30068  30582  31096  31610  32124  32638
 -32384 -31870 -31356 -30842 -30328 -29814 -29300 -28786
  -3600  -3086  -2572  -2058  -1544  -1030   -516     -2
" \
        "" "$input"
SKIP=

$little_endian && SKIP=1
testing "hexdump -e /2 %d (big endian)" \
        "hexdump -e '8/2 \" %6d\" \"\n\"'" \
        "\
      1    515   1029   1543   2057   2571   3085   3599
   4113   4627   5141   5655   6169   6683   7197   7711
  28785  29299  29813  30327  30841  31355  31869  32383
 -32639 -32125 -31611 -31097 -30583 -30069 -29555 -29041
  -3855  -3341  -2827  -2313  -1799  -1285   -771   -257
" \
        "" "$input"
SKIP=

$little_endian || SKIP=1
testing "hexdump -e /2 %x (little endian)" \
        "hexdump -e '8/2 \" %6x\" \"\n\"'" \
        "\
    100    302    504    706    908    b0a    d0c    f0e
   1110   1312   1514   1716   1918   1b1a   1d1c   1f1e
   7170   7372   7574   7776   7978   7b7a   7d7c   7f7e
   8180   8382   8584   8786   8988   8b8a   8d8c   8f8e
   f1f0   f3f2   f5f4   f7f6   f9f8   fbfa   fdfc   fffe
" \
        "" "$input"
SKIP=

$little_endian && SKIP=1
testing "hexdump -e /2 %x (big endian)" \
        "hexdump -e '8/2 \" %6x\" \"\n\"'" \
        "\
      1    203    405    607    809    a0b    c0d    e0f
   1011   1213   1415   1617   1819   1a1b   1c1d   1e1f
   7071   7273   7475   7677   7879   7a7b   7c7d   7e7f
   8081   8283   8485   8687   8889   8a8b   8c8d   8e8f
   f0f1   f2f3   f4f5   f6f7   f8f9   fafb   fcfd   feff
" \
        "" "$input"
SKIP=

$little_endian || SKIP=1
testing "hexdump -n4 -e '\"%u\"' (little endian)" \
	"hexdump -n4 -e '\"%u\"'" \
	"12345678" \
	"" \
	"\x4e\x61\xbc\x00AAAA"
SKIP=

$little_endian && SKIP=1
testing "hexdump -n4 -e '\"%u\"' (big endian)" \
	"hexdump -n4 -e '\"%u\"'" \
	"1315027968" \
	"" \
	"\x4e\x61\xbc\x00AAAA"
SKIP=

exit $FAILCOUNT
